// utils/request.js
/**
 * 统一请求工具
 * @param {Object} options - 请求配置（url, method, data, header 等）
 * @returns {Promise} - 返回 Promise 对象
 */
export default function request(options) {
  // 1. 基础配置（环境隔离：区分开发/生产环境的 baseURL）
  const baseURL = process.env.NODE_ENV === "development" 
    ? "http://127.0.0.1:5000" // 开发环境后端地址（根据实际后端端口修改）
    : "https://api.your-cloud-kitchen.com"; // 生产环境地址，注意后端没有/api前缀

  // 2. 合并请求配置
  const config = {
    url: baseURL + options.url, // 拼接基础地址和接口路径
    method: options.method || "GET", // 默认 GET 方法
    header: {
      "Content-Type": "application/json", // 默认 JSON 格式，POST请求会使用此类型
      ...options.header // 允许覆盖自定义 header
    },
    timeout: 10000, // 超时时间（10秒）
    withCredentials: true, // 允许跨域携带凭证（cookies）

  };
  
  
  // 3. 根据请求方法设置数据
  const method = options.method?.toUpperCase() || 'GET';
  
  if (method === 'GET') {
    // 对于GET请求，构建查询字符串并直接添加到URL中
    if (options.params && Object.keys(options.params).length > 0) {
      const queryString = Object.keys(options.params)
        .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(options.params[key])}`)
        .join('&');
      
      config.url += (config.url.includes('?') ? '&' : '?') + queryString;
    }
    // 清空params，避免uni.request自动处理
    config.params = {};
  } else {
    // 对于POST、PUT等请求，确保数据正确设置
    config.data = options.data || {};
  }

  // 3. 携带登录态（token）：除登录接口外，所有请求都带 token
  const noTokenUrls = ["/auth/login"]; // 不需要 token 的接口，路径已更新
  if (!noTokenUrls.includes(options.url)) {
    const token = uni.getStorageSync("token");
    if (token) {
      config.header.Authorization = `Bearer ${token}`; // 按后端要求的格式携带（示例：Bearer Token）
    }
  }

  // 4. 返回 Promise，处理响应和错误
  return new Promise((resolve, reject) => {
    // 显示加载中动画（如果配置允许）
    if (options.showLoading !== false) {
      uni.showLoading({ title: '加载中...' });
    }
    
    uni.request({
      ...config,
      // 响应成功（状态码 200）
      success(res) {
        const responseData = res.data;
        
        // 处理登录/注册响应格式 {message, success, token, user}
        if (responseData && typeof responseData === 'object' && ('success' in responseData)) {
          // 检查是否是登录/注册接口
          const isAuthUrl = options.url === '/auth/login' || options.url === '/auth/register';
          
          if (responseData.success) {
              // 成功处理
              if (isAuthUrl && responseData.token) {
                // 特殊处理登录/注册成功，保留原始响应格式
                resolve(responseData);
              } else {
                // 其他成功响应，返回data字段或整个响应
                resolve(responseData.data || responseData);
              }
            } else {
            // 失败处理
            uni.showToast({ title: responseData.message || "请求失败", icon: "none" });
            reject(new Error(responseData.message || "业务错误"));
          }
        } 
        // 检查是否是标准的 {code, data, message} 格式
        else if (responseData && typeof responseData === 'object' && 'code' in responseData) {
          const { code, data, message } = responseData;
          switch (code) {
            case 200:
              resolve(data); // 成功：返回响应体中的 data
              break;
            case 401:
              // 未登录/ token 过期：清除缓存，跳转登录页
              uni.removeStorageSync("token");
              uni.reLaunch({ url: "/pages/user/login" });
              reject(new Error("登录已过期，请重新登录"));
              break;
            default:
              // 业务错误（如参数错误、数据不存在）：提示用户
              uni.showToast({ title: message || "请求失败", icon: "none" });
              reject(new Error(message || "业务错误"));
              break;
          }
        } else {
          // 非标准格式，直接返回数据（适用于没有统一响应格式的接口）
        resolve(responseData);
        }
      },
      // 网络错误（如超时、断网）
      fail(err) {
        uni.showToast({ title: "网络异常，请稍后再试", icon: "none" });
        reject(err);
      },
      // 无论成功失败，都会执行（如关闭加载中动画）
      complete() {
        // 只有在显示了加载动画的情况下才隐藏，确保配对使用
        if (options.showLoading !== false) {
          uni.hideLoading();
        }
      }
    });
  });
}